package com.mxgraph.io.vdx;

import com.mxgraph.util.mxPoint;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * This class is a wrapper for a shape element contained in a Master element.<br/>
 * If a property is not found in the shape Element but it may be found in a stylesheet
 * the property is searched in such stylesheet.
 */
public class mxMasterShape extends mxDelegateShape {
    public mxMasterShape(Element s) {
        super(s);
    }

    /**
     * Returns the points of a vertex shape.
     *
     * @param parentHeight Height of the parent cell of the vertex.
     * @return array of mxPoint whith the vertex's points
     */
    public mxPoint[] getVertexPoints(double parentHeight) {
        NodeList childrens = shape.getChildNodes();
        mxPoint origin = this.getOriginPoint(parentHeight);
        mxPoint dimentions = this.getDimentions();
        Element geom = mxVdxUtils.nodeListTag(childrens, mxVdxConstants.GEOM);
        NodeList lineToList = geom.getElementsByTagName(mxVdxConstants.LINE_TO);
        int length = lineToList.getLength();
        mxPoint[] points = new mxPoint[length];

        for (int i = 0; i < length; i++) {
            Element lineTo = (Element) lineToList.item(i);
            points[i] = getLineToXY(lineTo);
            points[i].setX(points[i].getX() + origin.getX());
            points[i]
                    .setY(points[i].getY() + origin.getY() + dimentions.getY());
        }
        return points;
    }

    /**
     * Return the co-ordinates of the top left corner of the Shape.
     *
     * @param parentHeight Height of the parent cell of the vertex.
     * @return mxPoint that represents the co-ordinates.
     */
    public mxPoint getOriginPoint(double parentHeight) {
        double px = 0;
        double py = 0;
        double lpy = 0;
        double lpx = 0;
        double h = 0;

        //Defines PinX
        if (this.hasPinX()) {
            px = this.getPinX();
        }

        //Defines PinY
        if (this.hasPinY()) {
            py = this.getPinY();
        }

        //Defines LocPinX
        if (this.hasLocPinX()) {
            lpx = this.getLocPinX();
        }

        //Defines LocPinY
        if (this.hasLocPinY()) {
            lpy = this.getLocPinY();
        }

        //Defines Height
        if (this.hasHeight()) {
            h = this.getHeight();
        }

        double x = (px) - (lpx);
        double y = parentHeight - ((py) + (h - lpy));
        return new mxPoint(x, y);
    }

    /**
     * Return the width and height of the Shape expressed like a mxPoint.
     * x = width
     * y = height
     *
     * @return mxPoint that represents the dimentions of the shape
     */
    public mxPoint getDimentions() {
        double w = 0;
        double h = 0;

        //Defines Width
        if (this.hasWidth()) {
            w = this.getWidth();
        }

        //Defines Height
        if (this.hasHeight()) {
            w = this.getHeight();
		}
		return new mxPoint(w, h);
	}
}
